package org.example.course.until;

import org.apache.commons.lang.StringUtils;
import org.example.commonapi.domain.*;
import org.example.commonapi.dto.CourseStudentDto;
import org.example.commonapi.util.StringUtil;
import org.example.commonapi.util.TimeUtil;
import org.example.commonapi.util.options.InboxService;
import org.example.course.observer.CourseAssignmentObservable;
import org.example.course.service.CourseClassService;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

import static org.example.commonapi.domain.Constants.Assignment_TYPE;

@Component
public class CourseUntil {

    @Resource
    private InboxService inboxService;

    @Resource
    private CourseClassService courseClassService;

    @Resource
    private CourseAssignmentObservable assignmentObservable;

    /**
     * 判断课程是否合法
     * @param course
     * @return
     */
    public static R isCourse(Course course){
        if(StringUtil.isAnyEmpty(course.getCourseName()))
            return R.error("课程信息不能为空");
        if(TimeUtil.compareTime( course.getEndTime(),course.getStartTime()))
            return R.error("开始时间不能晚于结束时间");
        else
            return null;
    }

    /**
     * 判断课程考试是否合法
     * @param courseExams
     * @return
     */
    public static R isCourseExams(CourseExams courseExams) {
        if (courseExams == null) {
            return R.error("课程考试信息不能为空");
        }
        if (StringUtil.isAnyEmpty(courseExams.getName())&&StringUtil.isAnyEmpty(courseExams.getStartTime(), courseExams.getEndTime())) {
            return R.error("考试名称、开始时间、结束时间不能为空");
        }
        if (TimeUtil.compareTime(courseExams.getStartTime(), courseExams.getEndTime())) {
            return R.error("开始时间不能晚于结束时间");
        }
        if(StringUtil.isAnyEmpty(courseExams.getTotalTime()))
            return R.error("考试时长不能为空");
        return null;
    }

    /**
     * 判断课程作业是否合法
     * @param courseAssignments
     * @return
     */
    public static R isCourseAssignments(CourseAssignments courseAssignments) {
        if (courseAssignments == null) {
            return R.error("课程作业信息不能为空");
        }
        if (StringUtil.isAnyEmpty(courseAssignments.getName())&&StringUtil.isAnyEmpty(courseAssignments.getStartTime(), courseAssignments.getEndTime())) {
            return R.error("作业名称、开始时间、结束时间不能为空");
        }
        if (TimeUtil.compareTime(courseAssignments.getStartTime(), courseAssignments.getEndTime())) {
            return R.error("开始时间不能晚于结束时间");
        }
        return null;
    }

    /**
     * 判断课程章节是否合法
     * @param courseChapters
     * @return
     */
    public static R isCourseChapters(CourseChapters courseChapters){
        if(StringUtil.isAnyEmpty(courseChapters.getName()))
            return R.error("课程章节名称不能为空");
        else
            return null;
    }


    /**
     * 判断课程章节视频是否合法
     * @param courseSonChaptersVideo
     * @return
     */
    public static R isSonChaptersVideo(CourseSonChaptersVideo courseSonChaptersVideo){
        if(StringUtil.isAnyEmpty(courseSonChaptersVideo.getName()))
            return R.error("章节名称不能为空");
        else
            return null;
    }

    /**
     * 判断课程章节测试是否合法
     * @param courseSonChaptersTest
     * @return
     */
    public static R isSonChaptersTest(CourseSonChaptersTest courseSonChaptersTest){
        if(StringUtil.isAnyEmpty(courseSonChaptersTest.getAnswer(),courseSonChaptersTest.getContent())||StringUtil.isAnyEmpty(courseSonChaptersTest.getType()))
            return R.error("测试名称或地址不能为空");
        else
            return null;
    }



    /**
     * 判断课程资源是否合法
     * @param courseResource
     * @return
     */
    public static R isCourseResource(CourseResource courseResource){
        if(StringUtil.isAnyEmpty(courseResource.getName()))
            return R.error("课程资源名称不能为空");
        else
            return null;
    }

    /**
     * 生成邀请码
     */
    public static String createInviteCode(){
        StringBuilder code = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 6; i++) {
            int type = random.nextInt(2);
            if (type == 0) { // 生成大写字母
                char c = (char) (random.nextInt(26) + 'A');
                code.append(c);
            } else { // 生成数字
                char c = (char) (random.nextInt(10) + '0');
                code.append(c);
            }
        }
        return code.toString();
    }

    /**
     * 修改成观察者模式
     * @param assignment
     */
    public void notifyAssignmentCreated(CourseAssignments assignment) {
        assignmentObservable.notifyObservers(
                assignment.getCourseId(),
                assignment.getName(),
                assignment.getId(),
                Assignment_TYPE,
                assignment.getCreateTime(),
                assignment.getEndTime()
        );
    }

}
